## packages: remove or add your necessary packages

required_packages <- c("tidyverse", "readxl", "ggthemes", "hrbrthemes", "extrafont", "plotly", "scales", "stringr", "gganimate", "here", "tidytext", "sentimentr", "scales", "DT", "here", "sm", "mblm", "glue", "fs", "knitr", "rmdformats", "janitor", "urltools", "colorspace", "pdftools")

library(ggplot2)    # CRAN v3.3.6
library(colorspace) # CRAN v2.0-3
library(here)       # CRAN v1.0.1
library(dplyr)      # CRAN v1.0.10
library(janitor)    # CRAN v2.1.0
library(gt)         # CRAN v0.5.0
library(tidyr)      # CRAN v1.2.1
library(readr)      # CRAN v2.1.3
library(stringr)    # CRAN v1.4.1
library(tidytext)
library(ggalt)
library(forcats)
library(lubridate)
library(ggforce)

# for(i in required_packages) { 
# if(!require(i, character.only = T)) {
# 
# #  if package is not existing, install then load the package
# install.packages(i, dependencies = T)
# require(i, character.only = T)
# }
# }


## save plots?
save <- TRUE
#save <- FALSE

## quality of png's
dpi <- 750

## font adjust; please adjust to client´s website
#extrafont::loadfonts(device = "win", quiet = TRUE)
#font_add_google("Montserrat", "Montserrat")
# font_add_google("Overpass", "Overpass")
# font_add_google("Overpass Mono", "Overpass Mono")



## theme updates; please adjust to client´s website
#theme_set(ggthemes::theme_clean(base_size = 15))
theme_set(ggthemes::theme_clean(base_size = 15, base_family = "Montserrat"))


theme_update(plot.margin = margin(30, 30, 30, 30),
             plot.background = element_rect(color = "white",
                                            fill = "white"),
             plot.title = element_text(size = 20,
                                       face = "bold",
                                       lineheight = 1.05,
                                       hjust = .5,
                                       margin = margin(10, 0, 25, 0)),
             plot.title.position = "plot",
             plot.caption = element_text(color = "grey40",
                                         size = 9,
                                         margin = margin(20, 0, -20, 0)),
             plot.caption.position = "plot",
             axis.line.x = element_line(color = "black",
                                        size = .8),
             axis.line.y = element_line(color = "black",
                                        size = .8),
             axis.title.x = element_text(size = 16,
                                         face = "bold",
                                         margin = margin(t = 20)),
             axis.title.y = element_text(size = 16,
                                         face = "bold",
                                         margin = margin(r = 20)),
             axis.text = element_text(size = 11,
                                      color = "black",
                                      face = "bold"),
             axis.text.x = element_text(margin = margin(t = 10)),
             axis.text.y = element_text(margin = margin(r = 10)),
             axis.ticks = element_blank(),
             panel.grid.major.x = element_line(size = .6,
                                               color = "#eaeaea",
                                               linetype = "solid"),
             panel.grid.major.y = element_line(size = .6,
                                               color = "#eaeaea",
                                               linetype = "solid"),
             panel.grid.minor.x = element_line(size = .6,
                                               color = "#eaeaea",
                                               linetype = "solid"),
             panel.grid.minor.y = element_blank(),
             panel.spacing.x = unit(4, "lines"),
             panel.spacing.y = unit(2, "lines"),
             legend.position = "top",
             legend.title = element_text(family = "Montserrat",
                                         color = "black",
                                         size = 14,
                                         margin = margin(5, 0, 5, 0)),
             legend.text = element_text(family = "Montserrat",
                                        color = "black",
                                        size = 11,
                                        margin = margin(4.5, 4.5, 4.5, 4.5)),
             legend.background = element_rect(fill = NA,
                                              color = NA),
             legend.key = element_rect(color = NA, fill = NA),
             #legend.key.width = unit(5, "lines"),
             #legend.spacing.x = unit(.05, "pt"),
             #legend.spacing.y = unit(.55, "pt"),
             #legend.margin = margin(0, 0, 10, 0),
             strip.text = element_text(face = "bold",
                                       margin = margin(b = 10)))

## theme settings for flipped plots
theme_flip <-
  theme(panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_line(size = .6,
                                          color = "#eaeaea"))

## theme settings for maps
theme_map <- 
  theme_void(base_family = "Montserrat") +
  theme(legend.direction = "horizontal",
        legend.box = "horizontal",
        legend.margin = margin(10, 10, 10, 10),
        legend.title = element_text(size = 17, 
                                    face = "bold"),
        legend.text = element_text(color = "grey33",
                                   size = 12),
        plot.margin = margin(15, 5, 15, 5),
        plot.title = element_text(face = "bold",
                                  size = 20,
                                  hjust = .5,
                                  margin = margin(30, 0, 10, 0)),
        plot.subtitle = element_text(face = "bold",
                                     color = "grey33",
                                     size = 17,
                                     hjust = .5,
                                     margin = margin(10, 0, -30, 0)),
        plot.caption = element_text(size = 14,
                                    color = "grey33",
                                    hjust = .97,
                                    margin = margin(-30, 0, 0, 0)))

## numeric format for labels
num_format <- scales::format_format(big.mark = ",", small.mark = ",", scientific = F)

## main color backlinko
bl_col <- "#00d188"
bl_dark <- darken(bl_col, .3, space = "HLS")

## colors + labels for interval stripes
int_cols <- c("#bce2d5", "#79d8b6", bl_col, "#009f66", "#006c45", "#003925")
int_perc <- c("100%", "95%", "75%", "50%", "25%", "5%")

## colors for degrees (Bachelors, Massters, Doctorate in reverse order)
cols_degree <- c("#e64500", "#FFCC00", darken(bl_col, .1))

## gradient colors for position
colfunc <- colorRampPalette(c(bl_col, "#bce2d5"))
pos_cols <- colfunc(10)

Load data

youtube_data <- read_csv(here("proc_data","youtube_data_proc.csv"))
youtube_data_activities <- read_csv(here("proc_data","youtube_data_activities_proc.csv"))
tiktok_data <-  read_csv(here("proc_data","tiktok_data_proc.csv"))
tiktok_data_activities <-  read_csv(here("proc_data","tiktok_data_activities_proc.csv"))

Calculate general stats

yt_vids <- youtube_data %>% distinct(yt_video_id) %>% nrow()
tt_vids <- tiktok_data %>% distinct(tt_video_id) %>% nrow()
youtube_data_activities %>% group_by(yt_video_id) %>% summarise(idn=max(idea)) %>% 
   pull(idn) %>% {length(which(.>1))}-> mult_ideas_yt
tiktok_data_activities %>% group_by(tt_video_id) %>% summarise(idn=max(idea)) %>% 
   pull(idn) %>% {length(which(.>1))} -> mult_ideas_tt

meanytlength <- youtube_data$video_length %>% summary %>% {./60}
meanttlength <- tiktok_data$video_meta_duration %>% summary 

General stats

YouTube: 177 videos (unique video url identifiers, includes YT shorts)
TikTok: 177 videos

YouTube videos are longer (12.15141 minutes on average for the sampled videos), so approximately one third of the videos examined (53/177) included >1 money-making idea. TikTok videos have a shorter maximum length (3 to 10 minutes; 41.14384 seconds on average for the sampled videos) so videos on this platform tend to feature a single idea. Only 4 of the 145 TikTok videos examined provided more than one money-making idea.

Publication dates

youtube_data <- youtube_data %>% mutate(month=month(ymd(youtube_data$publish_date)),
                        pyear=year(ymd(youtube_data$publish_date))) %>% 
  mutate(pub_date=ymd(publish_date))


tiktok_data <- tiktok_data %>% mutate(month=month(ymd_hms(tiktok_data$create_time_iso)),                                pyear=year(ymd_hms(tiktok_data$create_time_iso))) %>%
  mutate(pub_date=date(ymd_hms(create_time_iso))) 

3/4 of the YouTube videos examined were published in 2022, and across all the videos sampled (published since 2018), most are from the summer/fall season (Northern Hemisphere).

TikTok videos in the sample were published between 2019-2022, with more videos uploaded with each passing year. The month with most uploads is July.

tiktok_data %>% tabyl(pyear) %>% round(2)
##  pyear  n percent
##   2019  4    0.03
##   2020 29    0.20
##   2021 50    0.34
##   2022 63    0.43

Publication month also varied between platforms.

youtube_data %>% count(month) %>% 
  ggplot()+
  geom_bar(aes(x=month,y=n),stat = "identity")+
  scale_x_discrete(limits=month.abb) +labs(subtitle = "YouTube data")

tiktok_data %>% count(month) %>% 
  ggplot()+
  geom_bar(aes(x=month,y=n),stat = "identity")+
  scale_x_discrete(limits=month.abb) +labs(subtitle = "TikTok data")

Considering publication dates, videos published earlier do not tend to accumulate more views and comments over time. Engagement is also mostly unrelated to subscriber/follower counts and thus possibly related to content.

ttdatevc <- tiktok_data %>% select(source,pub_date,
                       comments=comment_count,
                       views=play_count,
                       followers=author_meta_fans)
ytdatevc <- youtube_data %>% select(source,pub_date,
                       comments=comments,
                       views=view_count,
                       followers=subs_numeric)
dates_views_comments <- bind_rows(ttdatevc,ytdatevc)

ggplot(dates_views_comments)+
  geom_point(aes(x=pub_date,y=views,color=source))+
  labs(x="Publication date")

ggplot(dates_views_comments)+
  geom_point(aes(x=pub_date,y=comments,color=source))+
    labs(x="Publication date")

ggplot(dates_views_comments)+
  geom_point(aes(x=views,y=comments,color=source))

ggplot(dates_views_comments)+
  geom_point(aes(x=followers,y=comments,color=source))

dates_views_comments %>% filter(followers!=44100000) %>% 
ggplot()+
  geom_point(aes(x=followers,y=comments,color=source))+
  labs(subtitle = "removed outlier")

ggplot(dates_views_comments)+
  geom_point(aes(x=followers,y=views,color=source))

dates_views_comments %>% filter(followers!=44100000) %>% 
ggplot()+
  geom_point(aes(x=followers,y=views,color=source))+
  labs(subtitle = "removed outlier")

Presenter demographics

yt_presenter_demog_gend <- youtube_data %>% tabyl(presenter_gender) %>% 
  mutate(valid_percent=round(valid_percent,2))
yt_malepct <- yt_presenter_demog_gend$valid_percent[2] 
tt_presenter_demog_gend <- tiktok_data %>% tabyl(presenter_gender) %>% 
  mutate(valid_percent=round(valid_percent,2))
tt_malepct <- tt_presenter_demog_gend$valid_percent[2] 
yt_ages <- youtube_data %>% tabyl(presenter_age) %>% na.omit() %>% select(-percent) %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent)
tt_ages <- tiktok_data %>% tabyl(presenter_age) %>% na.omit() %>% select(-percent) %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent)

Male presenters were represented more on both platforms (YouTube: 0.86% and TikTok 0.8%), and the 20-30 y.o. age category had the highest proportion with ~40%.

gt(yt_ages) %>% tab_header("YouTube")
YouTube
presenter_age n percent
10 - 20 6 0.03
20 - 30 76 0.43
30 - 40 49 0.28
40 - 50 4 0.02
50+ 3 0.02
Voice-over 20 0.11
Voice-over Text-to-Speech 18 0.10
gt(tt_ages) %>% tab_header("TikTok")
TikTok
presenter_age n percent
10 - 20 14 0.10
20 - 30 57 0.40
30 - 40 24 0.17
40 - 50 5 0.04
50+ 2 0.01
Music 8 0.06
Voice-over 6 0.04
Voice-over Text-to-Speech 25 0.18

Categories

YouTube videos, as categorized by their authors, varied in assignment despite the similar overarching topic.

The most common category was Education, followed by How-to % Stlye, and then all the others.

youtube_data %>% tabyl(category) %>% arrange(-n) %>% 
  mutate(across(where(is.numeric),round,2)) %>% gt() %>% tab_header(title = "YouTube data")
YouTube data
category n percent
Education 96 0.54
Howto & Style 46 0.26
People & Blogs 27 0.15
Entertainment 7 0.04
News & Politics 1 0.01

Earnings data

ytearn <- 
youtube_data_activities %>% 
  group_by(yt_video_id,idea,earnings_timeframe) %>% 
  summarise(earn=mean(earnings,na.rm=TRUE)) %>% ungroup() %>% na.omit() %>% 
  filter(earnings_timeframe!="No timeframe provided")
ttearn <- 
  tiktok_data_activities %>% 
  group_by(tt_video_id,idea,earnings_timeframe) %>% 
  summarise(earn=mean(earnings,na.rm=TRUE)) %>% ungroup() %>% na.omit() %>% 
  filter(earnings_timeframe!="No timeframe provided")

# earnings time frames
earn_tf <- bind_rows(ytearn,ttearn) %>% count(earnings_timeframe) %>% arrange(-n)

earnings_by_tf <- 
bind_rows(ytearn,ttearn) %>% group_by(earnings_timeframe) %>% 
  summarize(median_earn=median(earn),
            min_earn=min(earn),max_earn=max(earn),
            sd_earn=sd(earn,na.rm = TRUE)) %>% arrange(-median_earn)
  • The most common time frame for earnings was for daily income, followed by months and hours.
gt(earn_tf)
earnings_timeframe n
Days 69
Months 66
Hours 56
One-time earnings 31
Minutes 21
Weeks 9
Years 5
Per Post 2
  • Longer time frames report higher median earnings.
gt(earnings_by_tf)
earnings_timeframe median_earn min_earn max_earn sd_earn
Years 100000.000 500.000 400000.00 155449.21533
Months 5375.000 15.000 300000.00 50663.54170
Weeks 1050.000 24.000 14000.00 4357.91659
Days 500.000 5.000 7000.00 1324.43451
Hours 40.000 3.000 487.85 109.77971
One-time earnings 30.000 1.000 1225.00 271.99917
Minutes 26.000 0.042 400.00 152.51315
Per Post 16.895 0.500 33.29 23.18603

Standardized earnings

temporal_earn <- c("Days","Hours","Minutes","Months","Weeks","Years")

yt_tempearn <- ytearn %>% filter(earnings_timeframe %in% temporal_earn)
tt_tempearn <- ttearn %>% filter(earnings_timeframe %in% temporal_earn)

yt_hourly_earn <- 
yt_tempearn %>% mutate(hourly_earn=case_when(
  earnings_timeframe=="Hours"~earn,
  earnings_timeframe=="Minutes"~earn/60,
  earnings_timeframe=="Days"~earn/8,
  earnings_timeframe=="Weeks"~earn/40,
  earnings_timeframe=="Months"~earn/200,
  earnings_timeframe=="Years"~earn/2400
)) %>% mutate(source="YouTube")

tt_hourly_earn <- 
  tt_tempearn %>% mutate(hourly_earn=case_when(
    earnings_timeframe=="Hours"~earn,
    earnings_timeframe=="Minutes"~earn/60,
    earnings_timeframe=="Days"~earn/8,
    earnings_timeframe=="Weeks"~earn/40,
    earnings_timeframe=="Months"~earn/200,
    earnings_timeframe=="Years"~earn/2400
  )) %>% mutate(source="TikTok")

all_earn <- bind_rows(yt_hourly_earn,tt_hourly_earn) 

tt_h_earnsum <- 
tt_hourly_earn %>% summarize(mean_earn=mean(hourly_earn),
                             median_earn=median(hourly_earn))
yt_h_earnsum <- 
yt_hourly_earn %>% summarize(mean_earn=mean(hourly_earn),
                             median_earn=median(hourly_earn))

hourly_med <- median(all_earn$hourly_earn)


bind_rows(yt_hourly_earn,tt_hourly_earn) %>% 
  ggplot()+
  geom_histogram(aes(hourly_earn,fill=source),color="black",alpha=0.5)

For videos that report earnings associated with a temporal reference ($ earned per unit of time), earnings can be reported in a common unit by assuming 8 hour work days and 5 day work weeks. The median hourly earnings is 37.5.

Across all videos, earnings are right-skewed. 90% of videos report hourly earnings < 275.

std hourly earnings varied by platform

yt_hourly_earn %>% gt()
yt_video_id idea earnings_timeframe earn hourly_earn source
_bUsIgEFTTc 1 Years 500.000 0.20833333 YouTube
_bUsIgEFTTc 4 Days 500.000 62.50000000 YouTube
_bUsIgEFTTc 5 Days 500.000 62.50000000 YouTube
_bUsIgEFTTc 7 Days 500.000 62.50000000 YouTube
_bUsIgEFTTc 8 Days 500.000 62.50000000 YouTube
_bUsIgEFTTc 10 Days 500.000 62.50000000 YouTube
_bUsIgEFTTc 13 Days 500.000 62.50000000 YouTube
_XzohkDRIg4 2 Months 20000.000 100.00000000 YouTube
-1RxBdzag5s 3 Hours 24.000 24.00000000 YouTube
-SCeuojoLvk 1 Days 5.000 0.62500000 YouTube
1_XD-J0u5E8 1 Days 7000.000 875.00000000 YouTube
13ofczrqaxg 1 Days 300.000 37.50000000 YouTube
1N4WrjtLdME 3 Months 2842.000 14.21000000 YouTube
1N4WrjtLdME 4 Minutes 0.042 0.00070000 YouTube
1nGRr0Gs20I 1 Weeks 3000.000 75.00000000 YouTube
1nGRr0Gs20I 2 Hours 20.000 20.00000000 YouTube
1nGRr0Gs20I 3 Hours 20.000 20.00000000 YouTube
1nGRr0Gs20I 4 Days 845.000 105.62500000 YouTube
1nGRr0Gs20I 5 Hours 20.000 20.00000000 YouTube
1wzeMmZXb6w 1 Days 400.000 50.00000000 YouTube
2VUFErn6KYI 1 Months 100000.000 500.00000000 YouTube
2ZiRAXI6dMo 1 Minutes 15.000 0.25000000 YouTube
4lP0ggnALgo 1 Days 300.000 37.50000000 YouTube
4lP0ggnALgo 2 Days 300.000 37.50000000 YouTube
6q677iHcBXQ 1 Hours 400.000 400.00000000 YouTube
8aXm3lxY-l8 1 Months 22000.000 110.00000000 YouTube
8bPA0LyT9As 1 Minutes 5.000 0.08333333 YouTube
9dln9LD664U 1 Days 90.000 11.25000000 YouTube
9WSm3hEBWew 1 Days 150.000 18.75000000 YouTube
aGSgZj6EXmQ 1 Minutes 2.000 0.03333333 YouTube
aIHnzLfF0LM 1 Days 500.000 62.50000000 YouTube
Aqin0l-TmNQ 1 Days 845.400 105.67500000 YouTube
baby3ySqBt0 1 Months 800.000 4.00000000 YouTube
Bc6Q25P7eEc 1 Days 100.000 12.50000000 YouTube
C4S-I34hbsY 1 Minutes 2.000 0.03333333 YouTube
cC55IFwQzgQ 1 Weeks 14000.000 350.00000000 YouTube
craXmdbjOkA 1 Months 2000.000 10.00000000 YouTube
dEyLskBhlHg 1 Days 1400.000 175.00000000 YouTube
DFqByLHKof8 1 Months 8000.000 40.00000000 YouTube
DIBCleKpD84 2 Hours 40.000 40.00000000 YouTube
dukk5kxBSqI 3 Hours 59.500 59.50000000 YouTube
dvKGiNymrto 1 Days 500.000 62.50000000 YouTube
E9yGXwAv4qI 1 Hours 350.000 350.00000000 YouTube
EAj0ZsYcHkQ 7 Days 90.000 11.25000000 YouTube
EKTCKQ1qh1E 1 Hours 7.040 7.04000000 YouTube
EufU0UW6NAA 1 Hours 17.500 17.50000000 YouTube
EufU0UW6NAA 2 Hours 17.500 17.50000000 YouTube
EufU0UW6NAA 3 Hours 20.000 20.00000000 YouTube
EufU0UW6NAA 4 Hours 17.500 17.50000000 YouTube
EufU0UW6NAA 5 Hours 15.000 15.00000000 YouTube
EufU0UW6NAA 6 Hours 15.000 15.00000000 YouTube
ft8XV4PWhWo 1 Days 800.000 100.00000000 YouTube
fYZfyNDqTcM 1 Minutes 2.400 0.04000000 YouTube
GF05Uv_LsGQ 3 Months 30000.000 150.00000000 YouTube
GF05Uv_LsGQ 4 Hours 30.000 30.00000000 YouTube
GfhehzbqJg0 1 Hours 30.000 30.00000000 YouTube
GGHDS6YO5t4 1 Days 400.000 50.00000000 YouTube
GhbAliLodHQ 1 Hours 487.850 487.85000000 YouTube
gkMf-Ovbq0s 1 Hours 35.000 35.00000000 YouTube
gNRGkMeITVU 1 Months 5750.000 28.75000000 YouTube
GxZveZPmY8c 1 Months 10000.000 50.00000000 YouTube
h6C0Dq_wcJ0 1 Minutes 30.000 0.50000000 YouTube
HoAPt2I_vio 1 Years 50500.000 21.04166667 YouTube
HscsIaNkiSM 2 Hours 33.000 33.00000000 YouTube
huFzCCkVrFE 1 Weeks 24.000 0.60000000 YouTube
I7dwq8SbA1g 1 Days 1000.000 125.00000000 YouTube
IDWttiy_tuA 1 Days 2500.000 312.50000000 YouTube
KjJPz4LLAjQ 1 Days 2000.000 250.00000000 YouTube
KpElctIq7tI 1 Days 900.000 112.50000000 YouTube
kxioWGoPleM 1 Months 2250.000 11.25000000 YouTube
kxioWGoPleM 2 Months 383.110 1.91555000 YouTube
kxioWGoPleM 3 Months 1442.910 7.21455000 YouTube
kxioWGoPleM 4 Months 1138.000 5.69000000 YouTube
kxioWGoPleM 5 Months 2040.000 10.20000000 YouTube
LVwOiCBghoo 1 Days 150.000 18.75000000 YouTube
lWWYfDTBe4M 1 Days 200.000 25.00000000 YouTube
LyvbLCScnO4 1 Days 1000.000 125.00000000 YouTube
M5y69v1RbU0 1 Months 62500.000 312.50000000 YouTube
M5y69v1RbU0 2 Weeks 2800.000 70.00000000 YouTube
M5y69v1RbU0 3 Months 11000.000 55.00000000 YouTube
M5y69v1RbU0 5 Weeks 3000.000 75.00000000 YouTube
M5y69v1RbU0 9 Months 100.000 0.50000000 YouTube
m7XIHtY-4OY 1 Days 230.000 28.75000000 YouTube
M8fRxETyl0E 2 Months 10000.000 50.00000000 YouTube
M8fRxETyl0E 3 Months 800.000 4.00000000 YouTube
M8fRxETyl0E 4 Months 51113.640 255.56820000 YouTube
M8fRxETyl0E 5 Months 10821.000 54.10500000 YouTube
M9YKeor__8A 1 Days 700.000 87.50000000 YouTube
McJNq9YLU_U 1 Days 2000.000 250.00000000 YouTube
MDSVdA4mi7Y 1 Days 1440.000 180.00000000 YouTube
mfOltZt8N-A 1 Days 150.000 18.75000000 YouTube
MiRNewk3udk 1 Days 1200.000 150.00000000 YouTube
MYJNWE2XqHg 2 Months 2500.000 12.50000000 YouTube
N7LFPNYgMOI 2 Months 55.000 0.27500000 YouTube
N7LFPNYgMOI 3 Days 10.000 1.25000000 YouTube
N7LFPNYgMOI 6 Hours 3.000 3.00000000 YouTube
N7LFPNYgMOI 7 Hours 80.000 80.00000000 YouTube
n8JHnLgodRI 1 Days 500.000 62.50000000 YouTube
NbZKmuV04ZE 1 Days 1100.000 137.50000000 YouTube
NjiffTbrvtg 1 Minutes 62.000 1.03333333 YouTube
nZJ6akKejhk 1 Hours 25.000 25.00000000 YouTube
nZJ6akKejhk 4 Hours 50.000 50.00000000 YouTube
oDzysLyNONw 1 Days 100.000 12.50000000 YouTube
osv3OzzG4L4 1 Days 975.000 121.87500000 YouTube
pRU-rWxgqYo 1 Days 11.000 1.37500000 YouTube
psFFTUChxXY 1 Days 2422.000 302.75000000 YouTube
PxOSbKWLeag 3 Days 600.000 75.00000000 YouTube
PxOSbKWLeag 6 Days 550.000 68.75000000 YouTube
PxOSbKWLeag 9 Months 800.000 4.00000000 YouTube
RHBZj4VG9KQ 1 Minutes 10.000 0.16666667 YouTube
rviYLc2G1EA 1 Days 1000.000 125.00000000 YouTube
Rxqv4PNkTpI 1 Minutes 57.000 0.95000000 YouTube
s3_BAjIf_g0 1 Hours 91.000 91.00000000 YouTube
sDXdGEEwxm4 5 Months 5000.000 25.00000000 YouTube
syjHdnNFqY8 1 Minutes 128.940 2.14900000 YouTube
U--gxB4PgUI 1 Days 200.000 25.00000000 YouTube
U4-mipOS1Lg 1 Minutes 4.000 0.06666667 YouTube
uEEIi8ay6WA 1 Days 300.000 37.50000000 YouTube
uEEIi8ay6WA 2 Days 300.000 37.50000000 YouTube
UmL8GiKeNtc 1 Days 900.000 112.50000000 YouTube
vabyLtut-6E 1 Months 55000.000 275.00000000 YouTube
vmbj8a22w6k 1 Days 1000.000 125.00000000 YouTube
vZ2ILye2hhU 1 Hours 62.160 62.16000000 YouTube
wcRNrrUQyRA 1 Months 88931.000 444.65500000 YouTube
WGxKjgy7R4g 1 Days 500.000 62.50000000 YouTube
WGxKjgy7R4g 3 Months 15.000 0.07500000 YouTube
wpDu8PxIpLs 1 Hours 100.000 100.00000000 YouTube
WpiuXvkljnA 2 Days 20.000 2.50000000 YouTube
X9Jpx0EPpNE 1 Minutes 15.000 0.25000000 YouTube
XB6pJFBYyyI 1 Hours 120.000 120.00000000 YouTube
XNimuebNYUM 1 Days 400.000 50.00000000 YouTube
xOQCRrTYzYs 1 Weeks 600.000 15.00000000 YouTube
XZMwI55Y9yk 1 Days 100.000 12.50000000 YouTube
ycS0UMlCsOc 3 Months 2000.000 10.00000000 YouTube
YDZ3M0Az8BU 1 Months 150000.000 750.00000000 YouTube
YDZ3M0Az8BU 2 Months 34000.000 170.00000000 YouTube
YDZ3M0Az8BU 3 Months 90000.000 450.00000000 YouTube
YDZ3M0Az8BU 6 Months 12500.000 62.50000000 YouTube
YDZ3M0Az8BU 7 Years 100000.000 41.66666667 YouTube
YVPcUlIOeaU 1 Months 3500.000 17.50000000 YouTube
yYF_F4laJzI 1 Months 1500.000 7.50000000 YouTube
z_socgndMtI 1 Days 1080.000 135.00000000 YouTube
z2eLgFziSgo 1 Days 500.000 62.50000000 YouTube
Z53jhGKtBrQ 1 Weeks 47.850 1.19625000 YouTube
Zmh_tJEpnh4 1 Weeks 1050.000 26.25000000 YouTube
zThTMJKSbZI 1 Days 1700.000 212.50000000 YouTube
tt_hourly_earn %>% gt()
tt_video_id idea earnings_timeframe earn hourly_earn source
6.740916e+18 1 Months 10000.00 5.000000e+01 TikTok
6.806650e+18 1 Days 150.00 1.875000e+01 TikTok
6.806767e+18 1 Hours 40.00 4.000000e+01 TikTok
6.810171e+18 1 Minutes 400.00 6.666667e+00 TikTok
6.818473e+18 1 Hours 100.00 1.000000e+02 TikTok
6.818473e+18 2 Hours 30.00 3.000000e+01 TikTok
6.818473e+18 4 Hours 17.00 1.700000e+01 TikTok
6.818473e+18 5 Hours 18.00 1.800000e+01 TikTok
6.821268e+18 1 Hours 36.00 3.600000e+01 TikTok
6.824169e+18 1 Minutes 62.50 1.041667e+00 TikTok
6.840986e+18 1 Days 235.68 2.946000e+01 TikTok
6.842404e+18 1 Minutes 1.00 1.666667e-02 TikTok
6.853234e+18 1 Years 134671.00 5.611292e+01 TikTok
6.856111e+18 1 Months 4397.00 2.198500e+01 TikTok
6.864793e+18 1 Hours 40.00 4.000000e+01 TikTok
6.870627e+18 1 Days 100.00 1.250000e+01 TikTok
6.873806e+18 1 Hours 75.00 7.500000e+01 TikTok
6.875602e+18 2 Months 52.00 2.600000e-01 TikTok
6.897752e+18 1 Hours 65.00 6.500000e+01 TikTok
6.899988e+18 1 Days 100.00 1.250000e+01 TikTok
6.906873e+18 1 Hours 20.00 2.000000e+01 TikTok
6.912251e+18 1 Minutes 26.00 4.333333e-01 TikTok
6.914441e+18 1 Hours 50.00 5.000000e+01 TikTok
6.922699e+18 1 Months 72000.00 3.600000e+02 TikTok
6.924254e+18 1 Days 7000.00 8.750000e+02 TikTok
6.929685e+18 1 Months 50000.00 2.500000e+02 TikTok
6.930072e+18 1 Minutes 400.00 6.666667e+00 TikTok
6.935061e+18 1 Hours 75.00 7.500000e+01 TikTok
6.939907e+18 1 Days 223.75 2.796875e+01 TikTok
6.964156e+18 1 Days 2250.00 2.812500e+02 TikTok
6.971524e+18 1 Years 400000.00 1.666667e+02 TikTok
6.976422e+18 1 Hours 75.00 7.500000e+01 TikTok
6.982244e+18 1 Months 9000.00 4.500000e+01 TikTok
6.994313e+18 1 Months 10000.00 5.000000e+01 TikTok
6.998873e+18 1 Days 300.00 3.750000e+01 TikTok
7.002335e+18 1 Minutes 400.00 6.666667e+00 TikTok
7.014454e+18 1 Months 2000.00 1.000000e+01 TikTok
7.014830e+18 1 Months 3000.00 1.500000e+01 TikTok
7.015728e+18 1 Hours 400.00 4.000000e+02 TikTok
7.019722e+18 1 Hours 18.00 1.800000e+01 TikTok
7.030721e+18 1 Months 7000.00 3.500000e+01 TikTok
7.045797e+18 1 Minutes 400.00 6.666667e+00 TikTok
7.049509e+18 1 Hours 400.00 4.000000e+02 TikTok
7.052787e+18 1 Days 5000.00 6.250000e+02 TikTok
7.053187e+18 1 Months 30000.00 1.500000e+02 TikTok
7.056126e+18 1 Months 4652.06 2.326030e+01 TikTok
7.056140e+18 1 Hours 50.00 5.000000e+01 TikTok
7.062751e+18 1 Days 300.00 3.750000e+01 TikTok
7.070975e+18 1 Months 249.75 1.248750e+00 TikTok
7.077357e+18 1 Hours 18.00 1.800000e+01 TikTok
7.077779e+18 1 Months 27000.00 1.350000e+02 TikTok
7.077945e+18 1 Hours 18.00 1.800000e+01 TikTok
7.078352e+18 1 Hours 75.00 7.500000e+01 TikTok
7.083514e+18 1 Hours 48.00 4.800000e+01 TikTok
7.091469e+18 1 Hours 90.00 9.000000e+01 TikTok
7.092172e+18 1 Hours 20.22 2.022000e+01 TikTok
7.094419e+18 1 Months 20000.00 1.000000e+02 TikTok
7.103583e+18 1 Months 3000.00 1.500000e+01 TikTok
7.107761e+18 1 Hours 99.00 9.900000e+01 TikTok
7.109952e+18 1 Weeks 1000.00 2.500000e+01 TikTok
7.112240e+18 1 Months 36.75 1.837500e-01 TikTok
7.113970e+18 1 Months 4000.00 2.000000e+01 TikTok
7.116128e+18 1 Hours 105.00 1.050000e+02 TikTok
7.117259e+18 1 Months 5000.00 2.500000e+01 TikTok
7.117259e+18 3 Months 100000.00 5.000000e+02 TikTok
7.119012e+18 1 Months 184500.00 9.225000e+02 TikTok
7.119523e+18 1 Hours 50.00 5.000000e+01 TikTok
7.120359e+18 1 Minutes 100.00 1.666667e+00 TikTok
7.121216e+18 1 Months 2500.00 1.250000e+01 TikTok
7.122933e+18 1 Hours 160.00 1.600000e+02 TikTok
7.123234e+18 1 Months 83486.00 4.174300e+02 TikTok
7.124876e+18 1 Hours 18.00 1.800000e+01 TikTok
7.125135e+18 1 Days 958.41 1.198012e+02 TikTok
7.129542e+18 1 Months 297.00 1.485000e+00 TikTok
7.130367e+18 1 Months 500.00 2.500000e+00 TikTok
7.132197e+18 1 Months 300000.00 1.500000e+03 TikTok
7.133672e+18 1 Months 10000.00 5.000000e+01 TikTok
7.135530e+18 1 Months 1500.00 7.500000e+00 TikTok
7.138988e+18 1 Months 2327.00 1.163500e+01 TikTok
7.148861e+18 1 Months 55000.00 2.750000e+02 TikTok

This distribution is also evident within earnings timeframes.

bind_rows(yt_hourly_earn,tt_hourly_earn) %>% 
  ggplot()+
  geom_histogram(aes(earn))+
  facet_wrap(~earnings_timeframe,scales = 'free')

Earnings by category (YouTube)

The more common categories (Education, Howto & Style) did not report the higher mean or median standardized earnings. Instead, the People and Blogs category and Entertainment had the top two positions.

yt_hourlycorrs <- left_join(yt_hourly_earn,youtube_data_activities)

yt_hourlycorrs_chp <- yt_hourlycorrs  %>% group_by(yt_video_id,idea) %>%
  chop(business_type_level_1) %>% chop(business_type_level_2) %>% chop(skills_required) %>% ungroup()
yt_hourlycorrs_chp %>% 
  group_by(category) %>% summarise(mean_earn=mean(hourly_earn),
                                   med_earn=median(hourly_earn)) %>% 
  arrange(-mean_earn) %>% gt()
category mean_earn med_earn
People & Blogs 206.80750 75.00
Entertainment 127.05000 125.00
Howto & Style 90.84293 43.75
Education 68.85482 37.50
yt_hourlycorrs_chp %>% 
  ggplot(aes(x=category,y=hourly_earn,color=category))+
  geom_sina() + scale_color_discrete(guide="none")

Business types and activities

YouTube - Level 1

For all YouTube videos, the predominant Business Type for the money-making ideas was Publication, Media, and Blogs, followed by the Service Business. Other business types were less common.

# without earnings
yt_acts_chp <- youtube_data_activities  %>% group_by(yt_video_id,idea) %>%
  chop(business_type_level_1) %>% chop(business_type_level_2) %>% chop(skills_required) %>% ungroup()

yt_bus1 <- youtube_data_activities  %>% group_by(yt_video_id,idea) %>%
  unchop(business_type_level_1) %>%  ungroup()

bus1ct <- yt_bus1 %>% group_by(yt_video_id,idea) %>% 
  distinct(yt_video_id,idea,business_type_level_1) %>% 
  tabyl(business_type_level_1) %>% arrange(-n)

bus1ct %>% na.omit() %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent) %>% 
  gt() %>% tab_header("YouTube",subtitle = "Business Types, all videos") 
YouTube
Business Types, all videos
business_type_level_1 n percent
Publication, Media & Blog 175 0.45
Service Business 122 0.31
Ecommerce & Consumer 56 0.14
Investing 27 0.07
Software & Tech 9 0.02


For videos and ideas with reported earnings, the business activity with the highest earnings (standardized) was Publication, Media, & Blog, followed by investing.

# with earninings

yt_hourlycorrs_bus1 <- yt_hourlycorrs  %>% group_by(yt_video_id,idea) %>%
unchop(business_type_level_1) %>%  ungroup()

yt_hourlycorrs_bus1 %>% group_by(yt_video_id,idea) %>% 
  distinct(yt_video_id,idea,business_type_level_1,hourly_earn) %>% ungroup() %>% 
  group_by(business_type_level_1) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-median_earn) %>% gt() %>% tab_header("YouTube",
                                                subtitle = "standardized hourly earning by business types")
YouTube
standardized hourly earning by business types
business_type_level_1 mean_earn median_earn
Publication, Media & Blog 123.72364 62.50000
Investing 31.20833 26.25000
Software & Tech 20.00000 20.00000
Service Business 35.67339 17.50000
Ecommerce & Consumer 48.28748 16.77083


However, there is considerable variation in earnings across the different business types

yt_hourlycorrs_bus1 %>% group_by(yt_video_id,idea) %>% 
  distinct(yt_video_id,idea,business_type_level_1,hourly_earn) %>% ungroup %>% 
  ggplot()+
  geom_sina(aes(x=str_wrap(business_type_level_1,12),
                  y=hourly_earn,color=business_type_level_1))+
  scale_color_discrete(guide="none")+labs(x="Business Type (level 1)")

YouTube - Level 2

yt_bus2 <- youtube_data_activities  %>% group_by(yt_video_id,idea) %>%
  unchop(business_type_level_2) %>%  ungroup()
n_bus2 <- youtube_data_activities %>% distinct(business_type_level_2) %>% nrow()
maxnbus2 <- yt_bus2 %>% group_by(yt_video_id,idea) %>% 
    distinct(yt_video_id,idea,business_type_level_2) %>% ungroup() %>% group_by(yt_video_id,idea) %>% summarise(nbus2=n()) %>% arrange(-nbus2) %>% pull(nbus2) %>% max()

The second-level classification of Business Activities for making money includes many more categories (51). Many combinations of Business Types were possible for each video/idea, but none included more than 3.

At this level no particular business type predominated, none represented >20% of suggested activities. The most frequent business type was Publication, Media & Blog - Affiliate Marketing, followed by Service Business - Microwork/tasks (e.g. Taking surveys, searching for data, tagging content and identifying images). Other types were much less common.

bus2ct <- yt_bus2 %>% group_by(yt_video_id,idea) %>% 
  distinct(yt_video_id,idea,business_type_level_2) %>% 
  tabyl(business_type_level_2) %>% arrange(-n)

bus2ct %>% na.omit() %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent) %>% filter(n>1) %>% 
  gt() %>% tab_header("YouTube",subtitle = "Business Types (LEVEL 2), all videos") %>% tab_footnote(footnote = "n=1 not shown",
                           locations = cells_column_labels(
                             columns = n
                           )) 
YouTube
Business Types (LEVEL 2), all videos
business_type_level_2 n1 percent
Publication, Media & Blog - Affiliate Marketing 86 0.19
Service Business - Microwork/tasks (e.g. Taking surveys, searching for data, tagging content and identifying images) 64 0.14
Publication, Media & Blog - YouTube 35 0.08
Service Business - Other freelance (e.g. on Upwork, Fiverr) 25 0.06
Service Business - Agency (e.g. Social Media Marketing, SEO, etc.) 19 0.04
Ecommerce & Consumer - Online shop on marketplaces (e.g. Ebay, Etsy) 18 0.04
Publication, Media & Blog - Courses 17 0.04
Ecommerce & Consumer - Dropshipping 14 0.03
Ecommerce & Consumer - Online Shop 14 0.03
Investing - Crypto 13 0.03
Publication, Media & Blog - Write a blog 11 0.02
Ecommerce & Consumer - Amazon FBA 10 0.02
Investing - Stocks 10 0.02
Ecommerce & Consumer - Sell belongings on marketplaces (e.g. Ebay, Craigslist, Etsy) 9 0.02
Investing - Real estate investing (e.g. House flipping/ Crowdfunding) 8 0.02
Publication, Media & Blog - Selling Digital Products (EBooks/Print On Demand etc)) 8 0.02
Publication, Media & Blog - Content Creator 7 0.02
Publication, Media & Blog - Influencer 5 0.01
Publication, Media & Blog - Youtube/Rumble/Pinterest Video Automation 5 0.01
Service Business - Become a Virtual Assistant 5 0.01
Software & Tech - Create A Website 5 0.01
Service Business - Freelance Writer 4 0.01
Ecommerce & Consumer - Facebook Marketplace 3 0.01
Publication, Media & Blog - Paid Community (Patreon) 3 0.01
Publication, Media & Blog - Spinning Articles 3 0.01
Publication, Media & Blog - Youtube Sponsorships 3 0.01
Service Business - Rent out stuff (e.g. storage space, truck) 3 0.01
Publication, Media & Blog - Image Sharing 2 0.00
Publication, Media & Blog - Membership Sites 2 0.00
Publication, Media & Blog - Newsletter/ Articles 2 0.00
Publication, Media & Blog - NFT's 2 0.00
Publication, Media & Blog - Podcasting 2 0.00
Publication, Media & Blog - Write a book 2 0.00
Service Business - Home Delivery Services 2 0.00
Service Business - Home Services (e.g. Power Washing, Pet sitting) 2 0.00
Service Business - Video Editor 2 0.00
Software & Tech - Create a mobile app 2 0.00
Software & Tech - Create a software 2 0.00
Software & Tech - Create Templates 2 0.00
1 n=1 not shown

The Business type with the highest mean standardized earnings was Publication, Media & Blog - Newsletter/ Articles, followed by Ecommerce & Consumer - Dropshipping and other types in the Publication/Media/Blogging fields.

yt_hourlycorrs_bus2 <- yt_hourlycorrs  %>% group_by(yt_video_id,idea) %>%
unchop(business_type_level_2) %>%  ungroup()
yt_hourlycorrs_bus2 %>% group_by(yt_video_id,idea) %>% 
  distinct(yt_video_id,idea,business_type_level_2,hourly_earn) %>% ungroup() %>% 
  group_by(business_type_level_2) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-median_earn) %>% gt() %>% tab_header("YouTube, Business Type Level 2",
                                                subtitle = "standardized hourly earning by business types")
YouTube, Business Type Level 2
standardized hourly earning by business types
business_type_level_2 mean_earn median_earn
Publication, Media & Blog - Newsletter/ Articles 312.50000 312.50000
Ecommerce & Consumer - Dropshipping 255.56820 255.56820
Publication, Media & Blog - Youtube Sponsorships 230.62500 230.62500
Publication, Media & Blog - Spinning Articles 118.50000 175.00000
Service Business - Sales Representative/Advisor 170.00000 170.00000
Publication, Media & Blog - Youtube/Rumble/Pinterest Video Automation 105.00000 105.00000
Publication, Media & Blog - Affiliate Marketing 151.74915 81.25000
Publication, Media & Blog - YouTube 118.58227 75.00000
Publication, Media & Blog - Membership Sites 70.00000 70.00000
Service Business - Rent out stuff (e.g. storage space, truck) 68.75000 68.75000
Investing - Crypto 62.50000 62.50000
Publication, Media & Blog - Content Creator 50.00000 50.00000
Software & Tech - Create A Website 47.50000 47.50000
Service Business - Home Services (e.g. Power Washing, Pet sitting) 45.62500 45.62500
Service Business - Home Delivery Services 42.25000 42.25000
Service Business - Agency (e.g. Social Media Marketing, SEO, etc.) 47.08333 37.50000
Service Business - Become a Virtual Assistant 40.62500 35.00000
Investing - Real estate investing (e.g. House flipping/ Crowdfunding) 31.35417 31.35417
Service Business - Freelance Writer 40.50000 30.00000
Publication, Media & Blog - NFT's 26.25000 26.25000
Publication, Media & Blog - Selling Digital Products (EBooks/Print On Demand etc)) 28.43240 25.59812
Publication, Media & Blog - Write a blog 25.25000 25.25000
Publication, Media & Blog - Creating Spotify Ads 25.00000 25.00000
Publication, Media & Blog - Courses 71.15000 20.00000
Ecommerce & Consumer - Online shop on marketplaces (e.g. Ebay, Etsy) 20.84028 16.77083
Service Business - Other freelance (e.g. on Upwork, Fiverr) 24.62292 15.00000
Service Business - Video Editor 15.00000 15.00000
Publication, Media & Blog - Paid Community (Patreon) 27.30518 10.00000
Service Business - Data Entry 10.00000 10.00000
Ecommerce & Consumer - Online Shop 9.09500 9.09500
Investing - Stocks 22.33333 4.00000
Service Business - Microwork/tasks (e.g. Taking surveys, searching for data, tagging content and identifying images) 30.40132 3.00000

The five business types at this level with n>6 show a wide range of earnings.

yt_hourlycorrs_bus2 %>% group_by(yt_video_id,idea) %>% 
  distinct(yt_video_id,idea,business_type_level_2,hourly_earn) %>% ungroup %>% add_count(business_type_level_2) %>% filter(n>6) %>% 
  ggplot()+
  geom_sina(aes(x=str_wrap(business_type_level_2,33),
                  y=hourly_earn,color=business_type_level_2))+
  scale_color_discrete(guide="none")+labs(x="Business Type (level 1)")+
  coord_flip()+labs(x="Business Type Level 2")

TikTok - Level 1

For TikTok videos, the predominant Business Type for the money-making ideas was Service Business with almost 50% of videos, followed by the Ecommerce & Consumer ventures. Other business types were less common.

# tt without earnings
tt_acts_chp <- tiktok_data_activities  %>% group_by(tt_video_id,idea) %>%
  chop(business_type_level_1) %>% chop(business_type_level_2) %>% chop(skills_required) %>% ungroup()

tt_bus1 <- tiktok_data_activities  %>% group_by(tt_video_id,idea) %>%
  unchop(business_type_level_1) %>%  ungroup()

tt_bus1ct <- tt_bus1 %>% group_by(tt_video_id,idea) %>% 
  distinct(tt_video_id,idea,business_type_level_1)  %>% 
  tabyl(business_type_level_1) %>% arrange(-n)


tt_bus1ct %>% na.omit() %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent) %>% 
  gt() %>% tab_header("TikTok",subtitle = "Business Types, all videos") 
TikTok
Business Types, all videos
business_type_level_1 n percent
Service Business 74 0.49
Ecommerce & Consumer 36 0.24
Publication, Media & Blog 28 0.19
Investing 12 0.08
Software & Tech 1 0.01

For videos and ideas with reported earnings, the business activity with the highest earnings (standardized) was Investing, followed by Ecommerce & Consumer

# tt with earninings
tt_hourlycorrs <- left_join(tt_hourly_earn,tiktok_data_activities)

tt_hourlycorrs_chp <- tt_hourlycorrs  %>% group_by(tt_video_id,idea) %>%
  chop(business_type_level_1) %>% chop(business_type_level_2) %>% chop(skills_required) %>% ungroup()

tt_hourlycorrs_bus1 <- tt_hourlycorrs  %>% group_by(tt_video_id,idea) %>%
  unchop(business_type_level_1) %>%  ungroup()

tt_hourlycorrs_bus1 %>% group_by(tt_video_id,idea) %>% 
  distinct(tt_video_id,idea,business_type_level_1,hourly_earn) %>% ungroup() %>% 
  group_by(business_type_level_1) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-median_earn) %>% gt()
business_type_level_1 mean_earn median_earn
Investing 230.37097 135.0000
Ecommerce & Consumer 215.47273 109.9006
Publication, Media & Blog 221.63810 31.2500
Service Business 58.37537 25.0000
Software & Tech 1.48500 1.4850

However, with some exceptions, earnings do not vary considerably across the different business types

tt_hourlycorrs_bus1 %>% group_by(tt_video_id,idea) %>% 
  distinct(tt_video_id,idea,business_type_level_1,hourly_earn) %>% ungroup %>% 
  ggplot()+
  geom_jitter(aes(x=str_wrap(business_type_level_1,12),
                  y=hourly_earn,color=business_type_level_1))+
  scale_color_discrete(guide="none")+labs(x="Business Type (level 1)",subtitle = "TikTok")

# 1 saving plots in pdf with example

# ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color= drv)) + 
#      geom_smooth(mapping = aes(linetype = drv), method = 'loess') +
#      geom_point()
# 
# if(save == T){ 
#   ggsave(here::here("plots", "name_plot.pdf"), 
#          width = 12.5, height = 8, device = cairo_pdf)
# }

# 2 pdfs will then be converted into the pngs using the 04_convert_pdfs_to_pngs.rmd file. 

View counts, comments, followers, and standardized earnings are not tightly associated.

yt_hourly_renamed <-  yt_hourlycorrs_chp %>%  
  select(earn=hourly_earn,views=view_count,source,comments,followers=subs_numeric)
  
tt_hourly_renamed <-  tt_hourlycorrs_chp %>%  
  select(earn=hourly_earn,views=play_count,source,comments=comment_count,
           followers=author_meta_fans)

hourlyboth <- bind_rows(yt_hourly_renamed,tt_hourly_renamed)

ggplot(hourlyboth)+aes(x=views,y=earn,color=source)+geom_point()

ggplot(hourlyboth)+aes(x=comments,y=earn,color=source)+geom_point()

ggplot(hourlyboth)+aes(x=followers,y=earn,color=source)+geom_point()

TikTok - Level 2

n_bus2tt <- tiktok_data_activities %>% distinct(business_type_level_2) %>% nrow()

tt_bus2 <- tiktok_data_activities  %>% group_by(tt_video_id,idea) %>%
  unchop(business_type_level_2) %>%  ungroup()
maxnbus2tt <- tt_bus2 %>% group_by(tt_video_id,idea) %>% 
    distinct(tt_video_id,idea,business_type_level_2) %>% ungroup() %>% group_by(tt_video_id,idea) %>% summarise(nbus2=n()) %>% arrange(-nbus2) %>% pull(nbus2) %>% max()

TikTok videos mentioned fewer (33) Business Activities in this level than Youtube videos. Many combinations of Business Types were possible for each video/idea, but none included more than 3.

No particular business type predominated, none represented >20% of suggested activities. The most frequent business type was Service Business - Microwork/tasks (e.g. Taking surveys, searching for data, tagging content and identifying images), followed by Ecommerce & Consumer - Online shop on marketplaces (e.g. Ebay, Etsy). Other types were much less common.

bus2ctt <- tt_bus2 %>% group_by(tt_video_id,idea) %>% 
  distinct(tt_video_id,idea,business_type_level_2) %>% 
  tabyl(business_type_level_2) %>% arrange(-n)

bus2ctt %>% na.omit() %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent) %>% filter(n>1) %>% 
  gt() %>% tab_header("TikTok",subtitle = "Business Types (LEVEL 2), all videos") %>% tab_footnote(footnote = "n=1 not shown",
                           locations = cells_column_labels(
                             columns = n
                           )) 
TikTok
Business Types (LEVEL 2), all videos
business_type_level_2 n1 percent
Service Business - Microwork/tasks (e.g. Taking surveys, searching for data, tagging content and identifying images) 30 0.16
Ecommerce & Consumer - Online shop on marketplaces (e.g. Ebay, Etsy) 16 0.09
Ecommerce & Consumer - Dropshipping 14 0.08
Service Business - Agency (e.g. Social Media Marketing, SEO, etc.) 10 0.05
Publication, Media & Blog - Affiliate Marketing 9 0.05
Service Business - Other freelance (e.g. on Upwork, Fiverr) 9 0.05
Ecommerce & Consumer - Amazon FBA 8 0.04
Investing - Real estate investing (e.g. House flipping/ Crowdfunding) 8 0.04
Ecommerce & Consumer - Online Shop 7 0.04
Publication, Media & Blog - Selling Digital Products (EBooks/Print On Demand etc)) 7 0.04
Publication, Media & Blog - YouTube 6 0.03
Service Business - Sales Representative/Advisor 5 0.03
Service Business - Vending Machine 5 0.03
Ecommerce & Consumer - Facebook Marketplace 4 0.02
Publication, Media & Blog - Image Sharing 4 0.02
Publication, Media & Blog - Youtube/Rumble/Pinterest Video Automation 4 0.02
Service Business - Become a Virtual Assistant 4 0.02
Service Business - Home Delivery Services 4 0.02
Service Business - Home Services (e.g. Power Washing, Pet sitting) 4 0.02
Ecommerce & Consumer - Sell belongings on marketplaces (e.g. Ebay, Craigslist, Etsy) 3 0.02
Investing - Stocks 3 0.02
Publication, Media & Blog - NFT's 3 0.02
Service Business - Freelance Writer 3 0.02
Service Business - Rent out room (e.g. Airbnb) 3 0.02
Service Business - Car Wash 2 0.01
Service Business - Furniture Flipping 2 0.01
Service Business - Rent out stuff (e.g. storage space, truck) 2 0.01
1 n=1 not shown

The Business type with the highest mean standardized earnings was Publication, Media & Blog - Write a blog (although this result is driven by a single video stating $300000 in monthly earnings through this method). After that Service Business - Furniture Flipping and Investing - Stocks have similar earnings, followed by various others.

tt_hourlycorrs_bus2 <- tt_hourlycorrs  %>% group_by(tt_video_id,idea) %>%
unchop(business_type_level_2) %>%  ungroup()

tt_hourlycorrs_bus2 %>% group_by(tt_video_id,idea) %>% 
  distinct(tt_video_id,idea,business_type_level_2,hourly_earn) %>% ungroup() %>% 
  group_by(business_type_level_2) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-median_earn) %>% gt() %>% tab_header("TikTok, Business Type Level 2",
                                                subtitle = "standardized hourly earning by business types")
TikTok, Business Type Level 2
standardized hourly earning by business types
business_type_level_2 mean_earn median_earn
Publication, Media & Blog - Write a blog 1500.00000 1500.00000
Service Business - Furniture Flipping 281.25000 281.25000
Investing - Stocks 278.05646 278.05646
Investing - Real estate investing (e.g. House flipping/ Crowdfunding) 135.00000 135.00000
Ecommerce & Consumer - Amazon FBA 195.74375 119.80125
Ecommerce & Consumer - Online Shop 100.00000 100.00000
Ecommerce & Consumer - Online shop on marketplaces (e.g. Ebay, Etsy) 217.68778 75.00000
Service Business - Agency (e.g. Social Media Marketing, SEO, etc.) 73.81944 75.00000
Service Business - Other freelance (e.g. on Upwork, Fiverr) 79.88095 75.00000
Service Business - Home Delivery Services 63.48438 63.48438
Ecommerce & Consumer - Dropshipping 184.46576 50.00000
Service Business - Car Wash 50.00000 50.00000
Service Business - Home Services (e.g. Power Washing, Pet sitting) 45.00000 40.00000
Publication, Media & Blog - Affiliate Marketing 281.49048 37.50000
Publication, Media & Blog - YouTube 501.50000 37.50000
Publication, Media & Blog - Youtube/Rumble/Pinterest Video Automation 323.33333 37.50000
Service Business - Freelance Writer 68.05556 30.00000
Ecommerce & Consumer - Sell belongings on marketplaces (e.g. Ebay, Craigslist, Etsy) 23.73000 23.73000
Service Business - Become a Virtual Assistant 29.99500 21.98500
Publication, Media & Blog - Selling Digital Products (EBooks/Print On Demand etc)) 37.50000 18.75000
Service Business - Rent out room (e.g. Airbnb) 18.31750 18.31750
Service Business - Microwork/tasks (e.g. Taking surveys, searching for data, tagging content and identifying images) 64.58271 18.00000
Service Business - Sales Representative/Advisor 18.74000 18.00000
Software & Tech - Create a software 1.48500 1.48500
Service Business - Vending Machine 0.71625 0.71625

The six business types at this level with n>5 also show a wide range of earnings.

tt_hourlycorrs_bus2 %>% group_by(tt_video_id,idea) %>% 
  distinct(tt_video_id,idea,business_type_level_2,hourly_earn) %>% ungroup %>% add_count(business_type_level_2) %>% filter(n>5) %>% 
  ggplot()+
  geom_sina(aes(x=str_wrap(business_type_level_2,33),
                  y=hourly_earn,color=business_type_level_2))+
  scale_color_discrete(guide="none")+labs(x="Business Type (level 1)")+
  coord_flip()+labs(x="Business Type Level 2")

Top earners

On YouTube, these three videos (from three different creators) report the highest earnings.

yt_hourlycorrs_chp %>% slice_max(hourly_earn,n = 3) %>% select(video_url,title,author,earnings_timeframe,earn,hourly_earn) %>% gt()
video_url title author earnings_timeframe earn hourly_earn
https://www.youtube.com/watch?v=1_XD-J0u5E8 NEW $7000/Day Copy Paste Website Pays Beginners! (Make Money Online) Online Hustle Days 7000 875
https://www.youtube.com/watch?v=YDZ3M0Az8BU 7 Ways To Make Your First $100,000 Online Iman Gadzhi Months 150000 750
https://www.youtube.com/watch?v=2VUFErn6KYI You Can’t Make Money Online if You Don’t Understand This Adam Enfroy Months 100000 500

On TikTok, these three videos (from three different creators) report the highest earnings.

tt_hourlycorrs_chp %>% slice_max(hourly_earn,n = 3) %>% select(web_video_url,text,author_meta_nick_name,earnings_timeframe,earn,hourly_earn) %>% gt()
web_video_url text author_meta_nick_name earnings_timeframe earn hourly_earn
https://www.tiktok.com/@adamenfroy/video/7132196947120753963 The most underrated #sidehustle? #makemoneyonline #blogging #affiliatemarketing adamenfroy Months 300000 1500.0
https://www.tiktok.com/@lukeisshorts/video/7119011507559664942 Anybody can do it #investor #passiveincome #makemoneyfromhome Luke Robins Months 184500 922.5
https://www.tiktok.com/@ecomjoshcarter/video/6924254455114370305 I QUIT MY 9-5... #ebay #dropshipping #ecom #makemoney ecomjoshcarter Days 7000 875.0

In particular, author “Adam Enfroy” appears on both of these platforms reporting 100-300k USD in monthly earnings.

Skills

Different money-making ideas on both platforms varied in the number of skills needed to generate earnings. For the most part, each idea needed only one or two different skills, and this was more evident on TikTok (much shorter videos with generally only one money-making idea).

skills_per_idea_yt <- 
youtube_data_activities %>% select(yt_video_id,idea,skills_required) %>% 
  group_by(yt_video_id,idea) %>%  distinct() %>% 
summarise(n_skills=n()) %>% ungroup() %>% mutate(source="YouTube") %>% 
    select(n_skills,source)

skills_per_idea_tt <- 
tiktok_data_activities %>% select(tt_video_id,idea,skills_required) %>% 
  group_by(tt_video_id,idea) %>%  distinct() %>% 
summarise(n_skills=n()) %>% ungroup()%>% mutate(source="TikTok") %>% 
  select(n_skills,source)

bind_rows(skills_per_idea_tt,skills_per_idea_yt) %>% 
ggplot()+
  geom_histogram(aes(x=n_skills,fill=source))

The makeup of required skills also varied across platforms.

On YouTube, the most mentioned skill was Marketing followed by Image or Video Editing.

youtube_data_activities %>% select(yt_video_id,idea,skills_required) %>% distinct() %>% tabyl(skills_required) %>% arrange(-n) %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent) %>% na.omit %>% gt() %>% tab_header(title = "YouTube")
YouTube
skills_required n percent
Marketing 152 0.24
Image Editing 83 0.13
Video Editing 81 0.13
Writing 70 0.11
Investing 69 0.11
Doing mircowork for businesses 67 0.11
Speaking 54 0.09
Web Development 29 0.05
Programming 22 0.03
Providing Home Services 3 0.00
Gaming 2 0.00

When an idea or video required two or more skills, the most common combinations were Speaking + Video Editing, Investing + Marketing, Speaking + Writing, and Image + Video Editing.

youtube_data_activities %>% select(yt_video_id,idea,skills_required) %>% 
  group_by(yt_video_id,idea) %>% 
  arrange(yt_video_id, skills_required) %>% 
  summarize(combination = paste0(skills_required, collapse = " - "), .groups = "drop") %>% 
  count(combination) %>% 
  filter(str_detect(combination," - ")) %>%  arrange(-n) %>% slice(1:10) %>% 
  gt() %>% tab_header("YouTube Data", subtitle="Combinations of >2 skills, Top 10 most common combinations shown")
YouTube Data
Combinations of >2 skills, Top 10 most common combinations shown
combination n
Speaking - Video Editing 13
Investing - Marketing 12
Speaking - Writing 12
Image Editing - Video Editing 7
Image Editing - Marketing 6
Image Editing - Marketing - Programming - Video Editing - Web Development - Writing 6
Image Editing - Investing 5
Image Editing - Speaking - Video Editing 4
Image Editing - Speaking - Video Editing - Writing 4
Investing - Investing 4

TikTok videos favored Investing, followed by Marketing and Writing.

tiktok_data_activities %>% group_by(tt_video_id,idea) %>% tabyl(skills_required) %>% arrange(-n) %>% mutate(percent=round(valid_percent,2)) %>% select(-valid_percent) %>% na.omit %>% gt() %>% tab_header(title = "TikTok")
TikTok
skills_required n percent
Investing 73 0.26
Marketing 57 0.20
Writing 37 0.13
Image Editing 33 0.12
Doing mircowork for businesses 32 0.11
Video Editing 21 0.07
Providing Home Services 9 0.03
Speaking 8 0.03
Web Development 8 0.03
Programming 5 0.02
Gaming 1 0.00

Despite the fewer videos that required >1 skill, there were some frequently mentioned skill combinations such as Investing + Marketing, followed by Marketing+Programming+Video Editing+Web Development+Writing.

tiktok_data_activities %>% select(tt_video_id,idea,skills_required) %>% 
  group_by(tt_video_id,idea) %>% 
  arrange(tt_video_id, skills_required) %>% 
  summarize(combination = paste0(skills_required, collapse = " - "), .groups = "drop") %>% 
  count(combination) %>% 
  filter(str_detect(combination," - ")) %>%  arrange(-n) %>% slice(1:10) %>% 
  gt() %>% tab_header("TikTok Data", subtitle="Combinations of >2 skills, Top 10 most common combinations shown")
TikTok Data
Combinations of >2 skills, Top 10 most common combinations shown
combination n
Investing - Marketing 9
Marketing - Programming - Video Editing - Web Development - Writing 4
Doing mircowork for businesses - Doing mircowork for businesses - Writing - Writing 3
Doing mircowork for businesses - Speaking 3
Image Editing - Image Editing 3
Marketing - Marketing 3
Doing mircowork for businesses - Writing 2
Image Editing - Image Editing - Image Editing - Image Editing - Investing - Investing - Investing - Investing 2
Image Editing - Image Editing - Investing - Investing - Marketing - Marketing 2
Image Editing - Image Editing - Marketing - Marketing 2

Skills and earnings

Across both platforms, the Skill with the highest mean standardized earnings (hourly) was Investing, followed by Marketing, Video Editing, and Writing.

ttskillearn <- 
tt_hourlycorrs %>% select(tt_video_id,idea,hourly_earn,skills_required) %>% group_by(tt_video_id,idea) %>% distinct() %>% 
  group_by(skills_required) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-mean_earn) 

ytskillearn <- 
yt_hourlycorrs %>% select(yt_video_id,idea,hourly_earn,skills_required) %>% group_by(yt_video_id,idea) %>% distinct() %>% 
  group_by(skills_required) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-mean_earn)

ytskillearns <- 
yt_hourlycorrs %>% select(yt_video_id,idea,hourly_earn,skills_required) %>% group_by(yt_video_id,idea) %>% distinct() %>% 
  ungroup %>%  mutate(source="YouTube")

ttskillearns <-  
tt_hourlycorrs %>% select(tt_video_id,idea,hourly_earn,skills_required) %>% group_by(tt_video_id,idea) %>% distinct() %>% 
ungroup %>% mutate(source="TikTok")

bothearn <- bind_rows(ytskillearns,ttskillearns) %>% group_by(skills_required) %>% 
  summarise(mean_earn=mean(hourly_earn),
            median_earn=median(hourly_earn)) %>% 
  arrange(-mean_earn)

gt(bothearn) %>% tab_header(title='all platforms',subtitle = "earnings by skill")
all platforms
earnings by skill
skills_required mean_earn median_earn
Investing 156.65162 50.00
Marketing 144.68466 50.00
Video Editing 137.25115 45.00
Writing 85.73030 20.00
Speaking 79.49211 20.00
Providing Home Services 45.30208 40.00
Doing mircowork for businesses 39.19790 11.25
Programming 38.74833 40.00
Web Development 37.03615 37.50
Gaming 36.00000 36.00
Image Editing 35.85725 25.00

By platform, differences in reported earnings appear. On YouTube, Marketing and Investing report the highest mean earnings. On TikTok, Video Editing and Investing report the highest earnings.

gt(ytskillearn)%>% tab_header(title='YouTube',subtitle = "earnings by skill")
YouTube
earnings by skill
skills_required mean_earn median_earn
Marketing 128.49585 62.50
Investing 107.55416 40.00
Video Editing 75.93473 50.00
Writing 63.99792 20.00
Speaking 53.45010 20.00
Web Development 43.12500 38.75
Programming 42.75000 40.00
Doing mircowork for businesses 32.01130 5.02
Providing Home Services 31.91667 25.00
Image Editing 31.00885 18.75
gt(ttskillearn) %>% tab_header(title='TikTok',subtitle = "earnings by skill")
TikTok
earnings by skill
skills_required mean_earn median_earn
Video Editing 364.99786 37.5000
Investing 189.38327 100.0000
Marketing 186.77555 50.0000
Speaking 153.27778 47.5000
Writing 110.56730 20.2200
Image Editing 52.82667 39.7300
Providing Home Services 51.99479 45.0000
Doing mircowork for businesses 49.78868 15.0000
Gaming 36.00000 36.0000
Programming 33.74625 33.4925
Web Development 27.29400 21.9850

Additionally, TikTok videos report significantly higher earnings for the same skills compared with YouTube videos.

ytskearnsummary <- ytskillearn %>% mutate(source="YouTube")
ttskearnsummary <- ttskillearn %>% mutate(source="TikTok")
bind_rows(ytskearnsummary,ttskearnsummary) %>% 
  ggplot()+
  geom_bar(aes(x=fct_reorder(skills_required,mean_earn),y=mean_earn,fill=source),stat="identity",position = "dodge")+coord_flip()+labs(x='skill')

The variation and spread of earnings by skill is consistent across platforms.

bind_rows(ytskillearns,ttskillearns) %>% 
  ggplot(aes(x=fct_reorder(skills_required,hourly_earn),y=hourly_earn,color=source))+
  geom_sina()+labs(x='skill')+
  coord_flip()

More required skills did not relate with greater earnings.

# skills_per_idea_ytid <- 
# youtube_data_activities %>% select(yt_video_id,idea,skills_required) %>% 
#   group_by(yt_video_id,idea) %>%  distinct() %>% 
# summarise(n_skills=n()) %>% ungroup() %>% mutate(source="YouTube")  
# 
# skills_per_idea_ttid <- 
# tiktok_data_activities %>% select(tt_video_id,idea,skills_required) %>% 
#   group_by(tt_video_id,idea) %>%  distinct() %>% 
# summarise(n_skills=n()) %>% ungroup()%>% mutate(source="TikTok")  

skillsearntt <- left_join(skills_per_idea_tt,tt_hourly_earn)
skillsearnyt <- left_join(skills_per_idea_yt,yt_hourly_earn)
bind_rows(skillsearntt,skillsearnyt) %>% 
  ggplot(aes(x=factor(n_skills),hourly_earn))+geom_boxplot()+
  labs(x="number of skills required per money-making idea",y="standardized earnings")

Video titles

In general, the video titles vary considerably across platforms in terms of length, content and style.

tiktok_data <-  tiktok_data %>% mutate(title_noHash=str_extract(text,"^[^#]*")) 
yt_tlength <- round(mean(str_length(youtube_data$title)),0)
tt_tlength <-round(mean(str_length(tiktok_data$text)))
tt_tlength_nh <-round(mean(str_length(tiktok_data$title_noHash)))

Without various trailing hashtags, YouTube video titles are on average, twice as long as TikTok titles (65 vs. 31 characters). Overall, roughly a third of the length of TikTok titles comprises various hashtags.

The words and bigrams (consecutive sequences of two words) that appear most frequently in the video’s titles vary significantly between platforms.

# tokenize 
stopwords <- c("for","in","a","the","to","with","from","by")
title_words_yt <- youtube_data %>% unnest_tokens(title_wrd,title,token = "words") %>% 
  filter(!title_wrd %in% stopwords)
title_bigrams_yt <- youtube_data %>% unnest_tokens(title_bg,title,token = "ngrams",n=2) 
title_words_tt <- tiktok_data %>% unnest_tokens(title_wrd,text,token = "tweets") %>% 
  filter(!title_wrd %in% stopwords)
title_bigrams_tt <- title_words_tt %>% mutate(nextwrdbg=lead(title_wrd)) %>% 
  unite(title_bg, title_wrd, nextwrdbg, sep = ' ')


wordsyt <- title_words_yt %>% count(title_wrd) %>% slice_max(n,n=15) %>% mutate(source="YouTube")
wordstt <- title_words_tt %>% count(title_wrd) %>% slice_max(n,n=15) %>% mutate(source="TikTok")
bg_yt <- title_bigrams_yt %>% count(title_bg) %>% slice_max(n,n=15) %>% mutate(source="YouTube")
bg_tt <- title_bigrams_tt %>% count(title_bg) %>% slice_max(n,n=15) %>% mutate(source="TikTok")
top15wrds <- bind_rows(wordsyt,wordstt)
top15bg <- bind_rows(bg_yt,bg_tt)

ggplot(top15wrds)+
  geom_lollipop(aes(x=fct_reorder(title_wrd,n),y=n))+
  facet_wrap(~source)+labs(x="word or hashtag",y='occurrences')+
  coord_flip()

ggplot(top15bg)+
  geom_lollipop(aes(x=fct_reorder(title_bg,n),y=n))+
  facet_wrap(~source)+labs(x="bigram",y='occurrences')+
  coord_flip()

Considering the top 15 words or bigrams, there is little overlap between platforms.